<!DOCTYPE html>
<title>Test that setting MediaSession event handler should notify the service</title>
<script src="../../../resources/testharness.js"></script>
<script src="../../../resources/testharnessreport.js"></script>
<script type="module">
import {MediaSessionServiceMock} from './resources/mediasessionservice-mock.js';
import {MediaSessionAction} from '/gen/services/media_session/public/mojom/media_session.mojom.m.js';

var expectations;

var nextExpectation = 0;

// Delay the initialization since the initialization of MediaSessionAction is delayed.
function getExpectations() {
  if (!expectations) {
    expectations = [
      [ MediaSessionAction.kPlay, true ],
      [ MediaSessionAction.kPause, true ],
      [ MediaSessionAction.kPreviousTrack, true ],
      [ MediaSessionAction.kNextTrack, true ],
      [ MediaSessionAction.kSeekBackward, true ],
      [ MediaSessionAction.kSeekForward, true ],
      [ MediaSessionAction.kSeekTo, true ],
      [ MediaSessionAction.kPlay, false ],
      [ MediaSessionAction.kPause, false ],
      [ MediaSessionAction.kPreviousTrack, false ],
      [ MediaSessionAction.kNextTrack, false ],
      [ MediaSessionAction.kSeekBackward, false ],
      [ MediaSessionAction.kSeekForward, false ],
      [ MediaSessionAction.kSeekTo, false ],
      [ MediaSessionAction.kPlay, true ],
      [ MediaSessionAction.kPause, true ],
      [ MediaSessionAction.kPreviousTrack, true ],
      [ MediaSessionAction.kNextTrack, true ],
      [ MediaSessionAction.kSeekBackward, true ],
      [ MediaSessionAction.kSeekForward, true ],
      [ MediaSessionAction.kSeekTo, true ],
    ];
  }
  return expectations;
}

async_test(function(t) {
  const m = new MediaSessionServiceMock();
  m.setEnableDisableActionCallback(t.step_func(function(action, isEnabled) {
    var expectedAction = getExpectations()[nextExpectation][0];
    var expectedIsEnabled = getExpectations()[nextExpectation][1];
    assert_equals(expectedAction, action);
    assert_equals(expectedIsEnabled, isEnabled);
    if (++nextExpectation >= getExpectations().length)
      t.done();
  }));

  // Setting handlers should notify the service.
  window.navigator.mediaSession.setActionHandler("play", _ => {});
  window.navigator.mediaSession.setActionHandler("pause", _ => {});
  window.navigator.mediaSession.setActionHandler("previoustrack", _ => {});
  window.navigator.mediaSession.setActionHandler("nexttrack", _ => {});
  window.navigator.mediaSession.setActionHandler("seekbackward", _ => {});
  window.navigator.mediaSession.setActionHandler("seekforward", _ => {});
  window.navigator.mediaSession.setActionHandler("seekto", _ => {});

  // Setting handlers again should not notify the service.
  window.navigator.mediaSession.setActionHandler("play", _ => {});
  window.navigator.mediaSession.setActionHandler("pause", _ => {});
  window.navigator.mediaSession.setActionHandler("previoustrack", _ => {});
  window.navigator.mediaSession.setActionHandler("nexttrack", _ => {});
  window.navigator.mediaSession.setActionHandler("seekbackward", _ => {});
  window.navigator.mediaSession.setActionHandler("seekforward", _ => {});
  window.navigator.mediaSession.setActionHandler("seekto", _ => {});

  // Unsetting handlers should notify the service.
  window.navigator.mediaSession.setActionHandler("play", null);
  window.navigator.mediaSession.setActionHandler("pause", null);
  window.navigator.mediaSession.setActionHandler("previoustrack", null);
  window.navigator.mediaSession.setActionHandler("nexttrack", null);
  window.navigator.mediaSession.setActionHandler("seekbackward", null);
  window.navigator.mediaSession.setActionHandler("seekforward", null);
  window.navigator.mediaSession.setActionHandler("seekto", null);

  // Unsetting handlers should not notify the service.
  window.navigator.mediaSession.setActionHandler("play", null);
  window.navigator.mediaSession.setActionHandler("pause", null);
  window.navigator.mediaSession.setActionHandler("previoustrack", null);
  window.navigator.mediaSession.setActionHandler("nexttrack", null);
  window.navigator.mediaSession.setActionHandler("seekbackward", null);
  window.navigator.mediaSession.setActionHandler("seekforward", null);
  window.navigator.mediaSession.setActionHandler("seekto", null);

  // Setting handlers again should notify the service.
  window.navigator.mediaSession.setActionHandler("play", _ => {});
  window.navigator.mediaSession.setActionHandler("pause", _ => {});
  window.navigator.mediaSession.setActionHandler("previoustrack", _ => {});
  window.navigator.mediaSession.setActionHandler("nexttrack", _ => {});
  window.navigator.mediaSession.setActionHandler("seekbackward", _ => {});
  window.navigator.mediaSession.setActionHandler("seekforward", _ => {});
  window.navigator.mediaSession.setActionHandler("seekto", _ => {});
}, "test that setting event handler notifies the mojo service");

</script>
